/**
 * EventQueue 事件队列：
 *  +微任务队列：resolve、reject、async/await、promise.then(onfulfilled,onrejected)
 *  +宏任务队列：事件绑定、定时器、ajax异步获取数据
 * 
 * 主任务队列(首先执行同步)：
 * 代码从上往下执行，遇到微任务和宏任务添加到各自队列，遇到同步代码直接执行
 * 主任务队列先添加微任务到主任务队列去执行，再添加宏任务去执行
 */

// 博客园: https://www.cnblogs.com/Nelsen8/articles/7966661.html

/*
let body = document.body;
body.addEventListener("click", () => {
    // 执行 事件绑定1 宏任务
    Promise.resolve().then(() => {
        console.log('2：再执行微任务队列中的任务')
    })
    console.log('1：先执行 事件1 同步代码')
})
body.addEventListener("click", () => {
    // 执行 事件绑定2 宏任务
    Promise.resolve().then(() => {
        console.log('4：再执行微任务队列中的任务')
    })
    console.log('3：先执行 事件2 同步代码')
})
*/


/*
console.log('1: 同步')
let intervalId;
Promise.resolve().then(()=>{
    console.log('2：微任务')
}).then(()=>{
    console.log('3：微任务')
})
setTimeout(() => {
    Promise.resolve().then(()=>{
        console.log('5：微任务')
    }).then(()=>{
        console.log('6：微任务')
    })
    intervalId = setInterval(() => {
        console.log('7：宏任务')
    }, 3000);
    console.log('4：setTimeout')
}, 0);
*/

setTimeout(() => {
    console.log('4: 宏任务')
});
Promise.resolve().then(() => {
    console.log('1: 微任务')
}).then(() => {// THEN_return
    return Promise.resolve('data').then((data) => {
        setTimeout(() => {
            console.log('5：宏任务')
        });
        console.log('2：同步')
        return data
    })
}).then(data => {
    console.log(3, data) //3 本来排在THEN_return前，但是需等待resolve的值
})